---
title: "Nginx Location 指令"
categories:
- nginx
tags:
---

<div id="content">
<pre class="example">
Syntax: 	location [ = | ~ | ~* | ^~ ] uri { ... }
location @name { ... }
Default: 	—
Context: 	server, location
</pre>
<p>
location通过“前缀字符串”(prefix string)或“正则表达式”(regular expression)来定义。
location的匹配是在URL被urldecode(url中%XX的转义字符）、相对路径解析（..或.）、路径压缩（多个/压缩成一个）之后进行的
</p>
<p>
~* 正则匹配（大小写敏感）
~ 正则匹配（大小写不敏感）
</p>
<p>
匹配过程：
</p>
<ol class="org-ol">
<li>使用“前缀字符串”定义的location匹配URL。在这些前缀字符串的匹配结果中，最长匹配的被选择</li>
<li>然后是“正则”匹配，以正则定义的顺序检查，当第一个正则匹配时，正则的匹配中止。</li>
<li>如果“正则”匹配到了，则使用正则的结果；否则使用第一步的结果</li>
</ol>
<p>
以下是例外情况：
</p>
<ol class="org-ol">
<li>匹配的“前缀字符串“是"^~"开关的，则不进行正则匹配了，直接使用这个结果</li>
<li>修饰符"="表示一个精确匹配，如果精确匹配到了，则匹配过程停止。这种方式能加速请求的处理过程</li>
</ol>
<pre class="example">
# 精确匹配
location = / {
    [ configuration A ]
}

# 前缀字字符串匹配
location / {
    [ configuration B ]
}

location /documents/ {
    [ configuration C ]
}

location ^~ /images/ {
    [ configuration D ]
}

location ~* \.(gif|jpg|jpeg)$ {
    [ configuration E ]
}

</pre>
<p>
如果”前缀匹配“的location结尾有一个'/'，并且请求被 proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass, memcached_pass, or grpc_pass 处理，则执行特殊匹配：
返回一个301，重定向到这个包含/结尾的地址
</p>
<pre class="example">

# 请求 /user 时，将被重定向到 /user/，然后执行proxy_pass user.example.com
location /user/ {
    proxy_pass http://user.example.com;
}

# 如果不希望上面的行为发生，则能够用一个精确匹配，这样请求 /user 的时候就 proxy_pass login.example.com 了
location = /user {
    proxy_pass http://login.example.com;
}

</pre>
</div>
<div class="status" id="postamble">
<p class="author">Author: amo</p>
<p class="validation"><a href="http://validator.w3.org/check?uri=referer">Validate</a></p>
</div>
